package com.atguigu.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 切面类
 * 包含
 *    前置通知
 *    后置通知
 *    异常通知
 *    返回通知
 *    环绕通知
 * @author gcq
 * @Create 2020-09-25
 */
@Aspect
public class logAspects {

    // 抽取公共切入点表达式
    // 1、本类引用
    // 2、其他类切面引用
    @Pointcut("execution(public int com.atguigu.aop.MathCaculator.*(..))")
    public void pointCut() { }

    // @Before 在目标方法之前切入，切入点表达式(指定在那个方法切入)
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        System.out.println("" +joinPoint.getSignature().getName()+ "运行。。。。@Before参数列表是：{"+ Arrays.asList(args)+"}");
    }

    /**
     * 方法执行之后
     * @param joinPoint
     */
    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(""+joinPoint.getSignature().getName()+"结束@After");
    }

    /**
     *方法执行完成之后
     * @param result
     */
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(Object result) {
        System.out.println("除法正常返回。。。@AfterReturning运行结果{" +result+"}");
    }

    /**
     * 方法出现异常之后
     * @param joinPoint
     * @param exception
     */
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logException(JoinPoint joinPoint ,Exception exception) {
        System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息{"+exception+"}");
    }
}